﻿using System;
using System.Collections.Generic;
using System.Text;

namespace PW.Mini.SlepowronskiJ.Siec.Algorytmy
{
    [Serializable]
    class WzrostBleduWalidacyjnegoStrategiaSN : WzrostBleduWalidacyjnego, IStrategia
    {
        /// <summary>
        /// najlepsza siec
        /// </summary>
        ///
        private double[][][] najlepszaSiec;

        public WzrostBleduWalidacyjnegoStrategiaSN(float maxWzrostBleduWalidacyjnego, bool przywrocSiec)
            : base(maxWzrostBleduWalidacyjnego, przywrocSiec) { }

        protected override double WyliczObecnyBladValidacyjny()
        {
            if (daneWalidacyjne != null && daneWalidacyjne.Length > 0 && daneWalidacyjne[0].Length > 0)
                return base.WyliczObecnyBladValidacyjny();
            else
                return Monitor.Instancja.BladSieci;
        }

        public override void PrzywrocNajlepszaSiec()
        {
            Monitor.Instancja.SiecNeuronowa.UstawWagi(najlepszaSiec);
            Monitor.Instancja.NumerIteracji = this.numerIteracjiMinBlad;
            Monitor.Instancja.BladSieci = this.minBladTestowy;
        }

        #region IStrategia Members

        public void Init(int size)
        {
            this.shouldStop = false;
            this.minBlad = Double.MaxValue;
            this.numerIteracjiMinBlad = 0;
            najlepszaSiec = Monitor.Instancja.SiecNeuronowa.PobierzWagi();
        }

        public void PostIteration()
        {
            if (Monitor.Instancja.NumerIteracji > 50)
            {
                double obecnyBlad = WyliczObecnyBladValidacyjny();
                if (obecnyBlad > this.maxWzrostBleduWalidacyjnego * this.minBlad)
                {
                    shouldStop = true;
                    if (przywrocSiec)
                        this.PrzywrocNajlepszaSiec();
                    return;
                }
                if (obecnyBlad < this.minBlad)// - Monitor.Instancja.WarunekStopBleduSieci)
                {
                    this.minBlad = obecnyBlad;
                    this.minBladTestowy = Monitor.Instancja.BladSieci;
                    this.numerIteracjiMinBlad = Monitor.Instancja.NumerIteracji;
                    najlepszaSiec = Monitor.Instancja.SiecNeuronowa.PobierzWagi();
                }
            }
        }

        public void PreIteration()
        {
        }

        public bool ShouldStop()
        {
            return shouldStop;
        }

        #endregion
    }


}
